package cn.dduan.fool.data.type.base.floating;

/**
 * 双精度浮点数
 * <p>
 * 注意：
 * 1. 位数与精度：double 类型在内存中占用 64 位（8 个字节）。
 * 它遵循 IEEE 754 标准，其中 1 位用于表示符号（0 表示正数，1 表示负数），11 位用于表示指数，剩下的 52 位用于表示尾数。
 * 这种表示方式使得 double 类型可以表示非常大或非常小的数值，并且能提供较高的精度
 * 2. 取值范围：大约是 ±4.9e - 324 到 ±1.8e + 308
 * 3. 默认值：在类中定义 double 类型的变量时，如果没有显式初始化，默认值是 0.0d
 * <p>
 * 应用场景：
 * 1. 科学计算：在物理学、数学、工程学等领域的科学计算中，需要处理大量的小数数据，double 类型的高精度特性可以满足这些计算需求。
 * 例如，计算物体的运动轨迹、进行复杂的数学建模等
 * 2. 金融计算：在金融领域，涉及到货币金额、利率、汇率等计算时，通常会使用 double 类型。
 * 不过在一些对精度要求极高的金融场景中，可能会使用 BigDecimal 类来避免浮点数精度问题
 * 3. 图形处理：在计算机图形学中，处理图像的颜色值、坐标位置等数据时，经常会用到 double 类型。例如，计算图像的缩放比例、旋转角度等
 * <p>
 * 比较问题：由于浮点数在计算机中的二进制表示存在精度问题，直接使用 == 比较两个 double 类型的值可能会得到意外的结果
 *
 * @author dduan
 * @version 1.0
 * @date 2023/4/12
 */
public class MyDouble {
    public static void main(String[] args) {
        double a = 0.1;
        double b = 0.2;
        double c = 0.3;
        System.out.println("a = " + a); // a = 0.1
        System.out.println("b = " + b); // b = 0.2
        System.out.println((a + b) == c); // (a + b)  == c 肯能输出false

        /**
         * (a + b)  == c 肯能输出false
         * 针对以上情况：
         * 为了解决这个问题，通常会定义一个很小的误差范围（如 1e-12），当两个数的差值小于这个误差范围时，就认为它们相等
         */
        double tolerance = 1e-12;
        System.out.println("tolerance = " + tolerance); // a = 0.1
        if (Math.abs((a + b) - c) < tolerance) {
            System.out.println("(a + b)  == c 近似相等");
        }
    }
}
